進入 Design and Declarations 章節的後半段。今天工作繁雜,忙得像一顆纏繞打轉的 Yoyo 溜溜球。沒太多精力看書做筆記,這次就言簡意賅地講述重要觀念吧!
將 class 中所有成員變數聲明為 private,以加強封裝性及安全性。這種方式可以強制使用者僅通過提供的 interface 使用成員,使 class 的內部實現細節與外部程式隔離。如果需要修改 class 的內部結構,外部程式碼只需重新編譯而無需改動。public 和 protected 則可對封裝性部分開放。
將高層級函式儘量設置為非成員函式。低層級函式需要直接訪問 private 成員,而高層級函式只是調用這些低層級函數。將高層級函數移出 class 的好處包括:
namespace 中。在 C++ 中使用 +、-、*、/ 等運算符重載時,如果希望左右兩邊的操作數都能進行隱式轉換,應將該運算符定義為非成員函式,並根據需要設置為 friend 以獲取成員訪問權。
成員函式的左操作數固定為 this 當前對象,不能隱式轉換;而非成員函數的兩個參數都可以被隱式轉換。例如,x + 2 可以轉換,但 2 + x 可能無法正常編譯。這讓自定義類型更像內建類型一樣方便使用。
此外,對單參數建構函式使用 explicit 可禁止隱式轉換。
swapswap 函數最初由 STL 引入,是處理異常安全性與解決自賦值問題的關鍵機制。其基本實現透過複製建構與賦值運算,可能導致效率低下且缺乏安全性。對於自定義的 class,應提供更高效且不拋出異常的 swap 實現。
使用下列方式可確保程式的穩定性與高效性,並兼容多種 swap 行為:
swap 成員函式,確保交換操作高效並且不拋出異常。namespace 下提供非成員 swap 函式,該函式應調用成員函式實現。swap 成員函式。swap 時,先用 using std::swap 讓 std::swap 在 scope 內可見,讓編譯器選擇最適合的實現。